Definimos inicialmente todos los paquetes que vamos necesitar para el trabajo.
La práctica se basará en los archivos de datos electorales que se indican a continuación, recopilando datos sobre las elecciones al Congreso de los Diputados en España desde 2008 hasta la actualidad, así como encuestas, códigos de municipios y abreviaturas
El trabajo consta de 4 bases de datos:
election_data: archivo con las elecciones al congresocod_mun: archivo con los códigos y nombres de cada municipioabbrev: siglas de cada partidosurveys: encuestas electorales desde 1982.election_data: archivo con las elecciones al congreso
tipo_eleccion: tipo de elecion (nacional, regional…)anno: Año de la eleccionmes: Mes de la eleccionvueltacodigo_ccaa: Código de la comunidad autónomacodigo_provincia:Código de la provinciacodigo_municipio: Código del municipiocodigo_distrito_electoral: Código del distritonumero_mesas: Número de mesas disponibleselection_data: archivo con las elecciones al congreso
censo: Número de personas del municipioparticipacion_1participacion_2votos_blancos: Cantidad de votos en blancovotos_nulos: Cantidad de votos nulosvotos_candidaturas: Cantidad de votos validossurveys: encuestas electorales desde 1982.
type_survey: tipo de encuesta (nacional, regional…)date_elec: fecha de las futuras eleccionesid_pollster, pollster, media: id y nombre de la empresa encuestadora, así como medio que la encargófield_date_from, field_date_to: fechas de inicio y fin del trabajo de la encuestaexit_poll: ¿es una encuesta a pie de urna?size: tamaño muestral de la encuestaturnout: participación (estimación)El objetivo de la entrega es realizar un análisis de los datos electorales, llevando a cabo la depuración, los resúmenes y los gráficos que consideres necesarios, tanto de los resultados como de la precisión de las encuestas electorales.
En concreto, debes trabajar únicamente en el período de tiempo que incluye las elecciones desde 2008 hasta las últimas elecciones de 2019
# Transforma los datos de surveys en tidydata
surveys_tidy <- surveys |>
pivot_longer( cols = "UCD":"EV",
names_to = "partidos",
values_to = "prob_votos",
values_drop_na = TRUE
)
# Transforma los datos de election_data en tidydata
election_data_tidy <- election_data |>
pivot_longer( cols = "BERDEAK-LOS VERDES":"COALICIÓN POR MELILLA",
names_to = "partidos",
values_to = "votos" ,
values_drop_na = TRUE
) |>
unite(c("codigo_ccaa","codigo_provincia", "codigo_municipio"),col="cod_mun",sep='-')|>
mutate(conv_elec = paste(mes, anno, sep = "-")) # creo una nueva variable conv_elec
# Especificar el orden deseado para conv_elec
orden_conv_elec <- c("03-2008", "11-2011", "12-2015", "06-2016", "04-2019", "11-2019")
# Convertir conv_elec en un factor con el orden especificado
election_data_tidy <- election_data_tidy |>
mutate(conv_elec = factor(conv_elec, levels = orden_conv_elec))# Union de election_data_tidy con las siglas de los partidos y con los nombres de municipios
election_data_tidy <- election_data_tidy |>
left_join(abbrev, by = c("partidos" = "denominacion")) |>
left_join(cod_mun, by = c("cod_mun" = "cod_mun"))
# Union de surveys_tidy con las siglas de los partidos
surveys_tidy <- surveys_tidy |>
left_join(abbrev, by = c("partidos" = "siglas"))
surveys_tidy <- surveys_tidy |>
rename(siglas = partidos) # Cambiar "partidos" a "siglas"
surveys_tidy <- surveys_tidy |>
rename( partidos = denominacion) # Cambiar "denominacion" a "partidos"
# Verificar las uniones
head(surveys_tidy)
head(election_data_tidy)# Reagrupa los partidos de los datos "surveys_tidy"
surveys_tidy <- surveys_tidy |>
mutate(partidos = case_when(
str_detect(partidos,"SOCIALISTA") ~ "PSOE",
str_detect(partidos,"PARTIDO POPULAR") ~ "PP",
str_detect(partidos,"CIUDADANOS") ~ "CS",
str_detect(partidos,"VASCO") ~ "PNV",
str_detect(partidos,"BLOQUE NACIONALISTA GALEGO") ~ "BNG",
str_detect(partidos,"PODEMOS") ~ "UP",
str_detect(partidos,"ESQUERRA.*CATALUNYA|CATALUNYA.*ESQUERRA") ~ "ERC",
str_detect(partidos,"BILDU") ~ "EH - BILDU",
str_detect(partidos,"VOX") ~ "VOX",
TRUE ~ "OTROS"
))
head(surveys_tidy)
# Reagrupa los partidos de los datos "election_data_tidy"
election_data_tidy <- election_data_tidy |>
mutate(partidos = case_when(
str_detect(partidos,"SOCIALISTA") ~ "PSOE",
str_detect(partidos,"PARTIDO POPULAR") ~ "PP",
str_detect(partidos,"CIUDADANOS") ~ "CS",
str_detect(partidos,"VASCO") ~ "PNV",
str_detect(partidos,"BLOQUE NACIONALISTA GALEGO") ~ "BNG",
str_detect(partidos,"PODEMOS") ~ "UP",
str_detect(partidos,"ESQUERRA.*CATALUNYA|CATALUNYA.*ESQUERRA") ~ "ERC",
str_detect(partidos,"BILDU") ~ "EH - BILDU",
str_detect(partidos,"VOX") ~ "VOX",
TRUE ~ "OTROS"
))
election_data_tidySe aplicaron filtros a la base de datos inicial para cumplir con el objetivo del trabajo:
# Filtro aplicado en los datos de surveys_tidy
surveys_filtered <- surveys_tidy |>
mutate(date_elec = as.Date(date_elec, format = "%Y-%m-%d"), # paquete lubridate
field_date_to = as.Date(field_date_to, format = "%Y-%m-%d"),
field_date_from = as.Date(field_date_from, format = "%Y-%m-%d"),
ano_elec = year(date_elec), # paquete necesario lubridate
tiempo_trabajo_campo = as.numeric(field_date_to-field_date_from)) |>
filter(2008 >= ano_elec & ano_elec <= 2019
& exit_poll == FALSE
& (size >= 500 | !is.na(size))
& tiempo_trabajo_campo >= 1)
# Filtro aplicado en los datos de election_data_tidy
election_filtered <- election_data_tidy |>
filter(partidos %in% c('PSOE', 'PP', 'CS', 'PNV', 'BNG', 'UP', 'ERC', 'EH - BILDU', 'VOX' ))# Selecion previa de las variables
election_data_tidy_select <- election_filtered |>
select('anno', 'cod_mun', 'numero_mesas','censo', 'participacion_1', 'participacion_2', 'votos_blancos', 'votos_nulos','votos_candidaturas','partidos','votos', 'conv_elec')
surveys_tidy_select <- surveys_filtered |>
select('size', 'turnout', 'partidos', 'prob_votos', 'ano_elec','tiempo_trabajo_campo', 'id_pollster', 'pollster', 'media') |>
rename('tamano_muestra' = 'size',
'estimacion_participac' = 'turnout')
# Join
datos_election <- election_data_tidy_select# Calcular estadísticas para la convocatoria electoral general
descripcion_convocatoria <- election_filtered |>
group_by(conv_elec) |>
summarise(
num_municipios = n_distinct(cod_mun), # Número total de municipios
total_votos = sum(votos, na.rm = TRUE), # Total de votos
total_censo = sum(censo, na.rm = TRUE), # Total de censo
tasa_participacion = total_votos / total_censo * 100, # Tasa de participación
prom_participacion = mean(votos / censo * 100, na.rm = TRUE) # Promedio de participación
)
# Filtrar los municipios con más de 100,000 habitantes
censo_100k <- election_filtered |>
filter(censo > 100000)
# Calcular estadísticas para la convocatoria electoral en municipios con más de 100k de censo
descripcion_convocatoria_100k <- censo_100k |>
group_by(conv_elec) |>
summarise(
num_municipios_100k = n_distinct(cod_mun), # Número total de municipios con 100k
total_votos_100k = sum(votos, na.rm = TRUE), # Total de votos en municipios con censo > 100k
total_censo_100k = sum(censo, na.rm = TRUE), # Total de censo en municipios con censo > 100k
tasa_participacion_100k = total_votos_100k / total_censo_100k * 100, # Tasa de participación
prom_participacion_100k = mean(votos / censo * 100, na.rm = TRUE) # Promedio de participación
)
# Unir ambas tablas por la columna 'conv_elec'
descripcion_convocatoria <- descripcion_convocatoria |>
left_join(descripcion_convocatoria_100k, by = "conv_elec") |>
select(conv_elec,num_municipios,tasa_participacion,prom_participacion,num_municipios_100k, tasa_participacion_100k,prom_participacion_100k)
# Mostrar la tabla con las estadísticas calculadas
descripcion_convocatoria# A tibble: 6 × 7
conv_elec num_municipios tasa_participacion prom_participacion
<fct> <int> <dbl> <dbl>
1 03-2008 8112 13.3 22.6
2 11-2011 8116 20.9 26.0
3 12-2015 8122 14.3 16.9
4 06-2016 8125 14.2 15.3
5 04-2019 8130 13.2 14.1
6 11-2019 8131 11.7 12.7
# ℹ 3 more variables: num_municipios_100k <int>, tasa_participacion_100k <dbl>,
# prom_participacion_100k <dbl>
# Agrupación de ganadores por año
ganadores_por_anno <- tabla_ganadores |>
group_by(conv_elec, vencedor) |>
summarise(count = n(), .groups = "drop")
# Mostrar resultados de los partidos ganadores en cada convocatoria
ggplot(ganadores_por_anno, aes(x = conv_elec, y = count, fill = vencedor)) +
geom_bar(stat = "identity", position = "stack") +
geom_text(
aes(
label = paste0(count),
color = vencedor),
position = position_stack(vjust = 0.5), # Centra las etiquetas en las barras
size = 3,
color = "white"
) +
scale_x_discrete( # Cambiar a escala discreta
breaks = orden_conv_elec, # Etiquetas en el orden deseado
labels = orden_conv_elec
) +
scale_fill_manual(
values = c(
"VOX" = "#80b042",
"PP" = "#004a95",
"PSOE" = "#e30613",
"UP" = "#a668f3",
"CS" = "#ff956a",
"PNV" = "#917b66",
"ERC" = "#edc158",
"OTROS" = "gray"
)
) +
labs(
title = "Distribución de Partidos Ganadores por Año",
x = "Convocatoria electoral",
y = "Número de Municipios",
fill = "Partido Ganador"
) +
theme_minimal() +
theme(
panel.background = element_rect(fill = "transparent", color = NA), # Fondo del panel transparente
plot.background = element_rect(fill = "transparent", color = NA), # Fondo general transparente
legend.background = element_rect(fill = "transparent", color = NA) # Fondo de la leyenda transparente
)Primero identificamos el partido ganador y el segundo partido ganador en cada una de las elecciones
# Función para identificar el segundo partido cuando el primero es el especificado
partido_vencedor1 <- function(partido_venc) {
censo_100k |>
group_by(conv_elec, municipio) |> # Agrupar por convocatoria electoral y municipio
arrange(desc(votos)) |> # Ordenar por número de votos en orden descendente
mutate(posicion = row_number()) |> # Asignar posición (1 = primero, 2 = segundo)
summarise(
primero_partido = partidos[posicion == 1], # Partido ganador
segundo_partido = partidos[posicion == 2], # Partido en segundo lugar
.groups = "drop"
) |>
filter(primero_partido == partido_venc) # Filtrar para que el partido ganador sea el especificado
}
# Obtener resultados cuando el primero es PSOE
resultados_psoe <- partido_vencedor1("PSOE")
# Obtener resultados cuando el primero es PP
resultados_pp <- partido_vencedor1("PP")
# Mostrar los resultados
resultados_psoe
resultados_ppHay en municipios que son unipartidistas
# Calcular número de municipios unipartidistas
mun_unipartidistas <- function(resultados) {
resultados |>
mutate(solo_un_partido = primero_partido == segundo_partido) |> # Identificar si el primero y el segundo partido son iguales
summarise(
municipios_unipartidistas = sum(solo_un_partido, na.rm = TRUE), # Contar municipios unipartidistas
total_municipios = n_distinct(municipio), # Total de municipios
porcentaje_unipartidistas = (municipios_unipartidistas / total_municipios) * 100, # Calcular porcentaje
.by = conv_elec # Agrupar por convocatoria electoral
)
}
# Aplicar la función a los resultados de PSOE y PP
municipios_unipartidistas_psoe <- mun_unipartidistas(resultados_psoe)
municipios_unipartidistas_pp <- mun_unipartidistas(resultados_pp)
# Crear una nueva tabla con los resultados de los municipios unipartidistas para cada partido
resultados_unipartidistas <- municipios_unipartidistas_psoe |>
left_join(municipios_unipartidistas_pp, by = "conv_elec", suffix = c("_psoe", "_pp")) |>
mutate(
total_municipios = total_municipios_psoe + total_municipios_pp, # Sumar los municipios totales
unipartidistas_pp = municipios_unipartidistas_pp, # Unipartidistas para PP
unipartidistas_psoe = municipios_unipartidistas_psoe # Unipartidistas para PSOE
) |>
select(
conv_elec,
unipartidistas_psoe,
unipartidistas_pp,
total_municipios
) # Seleccionar las columnas relevantes
# Calcular el porcentaje de municipios unipartidistas para PP y PSOE
resultados_unipartidistas <- resultados_unipartidistas |>
mutate(
porcentaje_unipartidistas_psoe = round((unipartidistas_psoe / total_municipios) * 100, 1), # Porcentaje de municipios unipartidistas PSOE
porcentaje_unipartidistas_pp = round((unipartidistas_pp / total_municipios) * 100, 1) # Porcentaje de municipios unipartidistas PP
)
# Mostrar la tabla con los resultados
resultados_unipartidistas# A tibble: 6 × 6
conv_elec unipartidistas_psoe unipartidistas_pp total_municipios
<fct> <int> <int> <int>
1 03-2008 15 21 47
2 11-2011 1 37 46
3 12-2015 2 31 38
4 06-2016 1 34 40
5 04-2019 36 1 40
6 11-2019 30 6 39
# ℹ 2 more variables: porcentaje_unipartidistas_psoe <dbl>,
# porcentaje_unipartidistas_pp <dbl>
Para ello vamos a eliminar los municipios en los que el partido ganador y el segundo ganador es el mismo
partido_vencedor <- function(partido_venc) {
censo_100k |>
group_by(conv_elec, municipio) |> # Agrupar por año, mes y municipio
arrange(desc(votos)) |> # Ordenar por número de votos en orden descendente
mutate(posicion = row_number()) |> # Asignar posición (1 = primero, 2 = segundo, etc.)
filter(
(posicion == 1 & partidos == partido_venc) | # Mantener el ganador que corresponde al filtro
(posicion == 2 & partidos != partido_venc) # Asegurar que el segundo partido sea diferente al ganador
) |>
reframe(
primero_partido = partidos[posicion == 1],
segundo_partido = partidos[posicion == 2],
conv_elec = unique(conv_elec),
municipio = unique(municipio)
)
}
# Obtener resultados cuando el primero es PSOE
resultados_psoe <- partido_vencedor("PSOE")
# Obtener resultados cuando el primero es PP
resultados_pp <- partido_vencedor("PP")
# Mostrar los resultados ajustados
resultados_psoe
resultados_pp# Crear un dataset combinado para ambos casos (PSOE y PP)
resultados_psoe <- partido_vencedor("PSOE") |> mutate(ganador = "PSOE")
resultados_pp <- partido_vencedor("PP") |> mutate(ganador = "PP")
resultados_comb <- bind_rows(resultados_psoe, resultados_pp)
# Gráfico de barras apiladas
ggplot(resultados_comb, aes(x = ganador, fill = segundo_partido)) +
geom_bar() +
geom_text(
stat = "count", # Calcula automáticamente el conteo
aes(
label = ..count.. # Etiqueta con el conteo
),
position = position_stack(vjust = 0.5), # Centrar las etiquetas en las barras
color = "white", # Color de las etiquetas
size = 3,
color = "white"
) +
scale_fill_manual(
values = c(
"VOX" = "#80b042",
"PP" = "#004a95",
"PSOE" = "#e30613",
"UP" = "#a668f3",
"CS" = "#ff956a",
"PNV" = "#917b66",
"ERC" = "#edc158",
"OTROS" = "gray"
)
) +
labs(
title = "Distribución de Segundos Partidos por Partido Ganador",
x = "Partido Ganador",
y = "Número de Municipios",
fill = "Segundo Partido"
) +
theme_minimal()+
facet_wrap(~ conv_elec) # Crear un gráfico por cada convocatoria electoral# Función para calibrar el error y generar tablas de salida
calibrar_error <- function(election_data, surveys) {
# Preparación de los datos de las elecciones: cálculo del porcentaje real de votos
election_data_grouped <- election_data |>
group_by(anno, partidos) |>
summarise(
actual_votes = sum(votos, na.rm = TRUE), # Total de votos por partido
total_votes = sum(votos_candidaturas, na.rm = TRUE), # Total de votos válidos
.groups = "drop"
) |>
mutate(
actual_share_percent = (actual_votes / total_votes) * 100 # Porcentaje real de votos
)
# Vincular encuestas con resultados reales
datos_combinados <- surveys |>
inner_join(election_data_grouped,
by = c("ano_elec" = "anno", "partidos" = "partidos")) |>
mutate(
error = prob_votos - actual_share_percent # Error: diferencia entre encuesta y resultado real
)
# Crear tabla con porcentajes
tabla_procentajes <- datos_combinados |>
select(
ano_elec, partidos, prob_votos, actual_share_percent, error
)
# Análisis del error: promedio y desviación estándar por partido
errores <- datos_combinados |>
group_by(partidos) |>
summarise(
mean_error = mean(error, na.rm = TRUE), # Error promedio
sd_error = sd(error, na.rm = TRUE), # Desviación estándar del error
n = n(), # Número de observaciones
.groups = "drop"
)
list(
tabla_procentajes = tabla_procentajes, # Tabla con porcentajes
errores = errores # Estadísticas del error
)
}
# Aplicar la función a los conjuntos de datos para todos los años
resultados <- calibrar_error(election_data_tidy_select, surveys_tidy_select)
# Resultados
tabla_procentajes <- resultados$tabla_procentajes # Tabla con porcentajes estimados y reales
errores <- resultados$errores # Estadísticas del error
# Mostrar las tablas
print(tabla_procentajes) # Vista previa de la tabla con porcentajes# A tibble: 567 × 5
ano_elec partidos prob_votos actual_share_percent error
<dbl> <chr> <dbl> <dbl> <dbl>
1 2008 PSOE 43.4 35.1 8.34
2 2008 PNV 6 27.6 -21.6
3 2008 ERC 4 7.23 -3.23
4 2008 PP 38.1 41.8 -3.70
5 2008 PSOE 43 35.1 7.94
6 2008 PNV 6 27.6 -21.6
7 2008 ERC 5 7.23 -2.23
8 2008 PP 39 41.8 -2.80
9 2008 PSOE 42.6 35.1 7.54
10 2008 PNV 6 27.6 -21.6
# ℹ 557 more rows
# A tibble: 5 × 4
partidos mean_error sd_error n
<chr> <dbl> <dbl> <int>
1 BNG -11.0 0.641 15
2 ERC -4.81 1.23 103
3 PNV -25.8 1.15 109
4 PP -3.37 1.46 170
5 PSOE 7.21 1.69 170
Comparamos los porcentajes de votos reales y los porcentajes de las encuestas por partido en cada elección, para ver que partidos son sobrestimados o subestimados.
# Crear gráfico de barras para comparar prob_votos (encuesta) vs actual_share_percent (votos reales)
ggplot(tabla_procentajes, aes(x = partidos, y = prob_votos, fill = "Encuesta")) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.7) +
geom_bar(aes(y = actual_share_percent, fill = "Votos Reales"), stat = "identity", position = "dodge", alpha = 0.7) +
scale_fill_manual(values = c("Encuesta" = "lightblue", "Votos Reales" = "orange")) +
labs(
title = "Comparación de Porcentajes: Encuestas vs Votos Reales",
x = "Partido",
y = "Porcentaje de Votos",
fill = "Fuente"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Siguiendo la clasificación establecida por el Ministerio de Agricultura y Pesca de España, se definen las zonas de la siguiente manera:
Con base en esta clasificación, hemos creado la variable “tipo_zona” como paso previo al análisis.
distribucion_voto <- election_filtered |>
mutate(tipo_zona = case_when(
censo < 2000 ~ "Rural",
censo >= 2000 & censo <= 10000 ~ "Semiurbano",
censo > 10000 ~ "Urbano"
)) |>
mutate(partidos = as_factor(partidos),
tipo_zona = factor(tipo_zona,
levels = c("Rural", "Semiurbano", "Urbano"),
ordered = TRUE))
# Agrupación por tipo de zona y partidos
porc_distribucion_voto <- distribucion_voto |>
group_by(tipo_zona) |>
mutate(total_votos_zona = sum(votos, na.rm = TRUE)) |>
group_by(tipo_zona, partidos) |>
summarise(
total_votos_partido = sum(votos, na.rm = TRUE),
porcentaje_votos = (total_votos_partido / total_votos_zona[1]) * 100,
.groups = "drop"
)
# Ver el resultado
porc_distribucion_votoggplot(porc_distribucion_voto, aes(x = tipo_zona, y = porcentaje_votos, fill = partidos)) +
geom_bar(stat = "identity", position = "fill") +
geom_text(
aes(
label = paste0(round(porcentaje_votos, 1), "%")
),
position = position_fill(vjust = 0.5), # Centra las etiquetas en las barras
size = 3,
color = "white"
) +
scale_fill_manual(
values = c(
"VOX" = "#80b042",
"PP" = "#004a95",
"PSOE" = "#e30613",
"UP" = "#a668f3",
"CS" = "#ff956a",
"PNV" = "#917b66",
"ERC" = "#edc158",
"OTROS" = "gray"
)
) +
labs(
title = "Distribución de votos por tipo de zona",
x = "Tipo de zona",
y = "Porcentaje de votos (%)",
fill = "Partidos"
) +
scale_y_continuous(labels = scales::percent_format(scale = 100)) +
theme_minimal()# Calcular el porcentaje de votos por partido en cada municipio
distribucion_voto_por_partido <- distribucion_voto |>
group_by(cod_mun, partidos) |>
summarise(
total_votos_partido = sum(votos, na.rm = TRUE),
total_votos_mun = sum(votos_candidaturas, na.rm = TRUE), # Total de votos válidos en el municipio
.groups = "drop"
) |>
mutate(
porcentaje_votos = (total_votos_partido / total_votos_mun) * 100
)
# Unir con el censo poblacional de cada municipio
datos_completos <- distribucion_voto_por_partido |>
left_join(election_filtered |> select(cod_mun, censo), by = "cod_mun")
# Calcular la correlación de Pearson entre el censo y el porcentaje de votos para cada partido
correlaciones <- datos_completos |>
group_by(partidos) |>
summarise(
correlacion_censo_votos = cor(censo, porcentaje_votos, use = "complete.obs"),
.groups = "drop"
)
# Ver los resultados de la correlación
print(correlaciones)# A tibble: 9 × 2
partidos correlacion_censo_votos
<fct> <dbl>
1 PSOE -0.0388
2 PP -0.0520
3 PNV -0.204
4 CS -0.0120
5 ERC -0.162
6 BNG 0.0232
7 UP 0.0837
8 EH - BILDU -0.134
9 VOX -0.0458
Los coeficientes de correlación indican que ningún partido muestra una correlación fuerte con el censo poblacional. La mayoría de los valores son negativos, pero muy cercanos a cero, lo que sugiere que el tamaño de la población no tiene una relación significativa con el porcentaje de votos recibido por los partidos en la mayoría de los casos.
# Calcular tasa de crecimiento poblacional por municipio
crecimiento_censo <- election_filtered |>
arrange(cod_mun, anno) |> # Asegurarse de que los datos están ordenados por municipio y año
group_by(cod_mun) |> # Agrupar por municipio
mutate(
tasa_crecimiento = (censo - lag(censo)) / lag(censo) * 100 # Calcular tasa de crecimiento
) |>
ungroup()
# Categorizar las tasas de crecimiento
crecimiento_censo <- election_filtered |>
drop_na(censo, votos) |>
arrange(cod_mun, anno) |> # Asegurarse de que los datos están ordenados por municipio y año
group_by(cod_mun) |>
mutate(
tasa_crecimiento = (censo - lag(censo)) / lag(censo) * 100, # Calcular tasa de crecimiento
tipo_crecimiento = case_when(
tasa_crecimiento > 0.5 ~ "Crecimiento positivo",
abs(tasa_crecimiento) <= 0.5 ~ "Crecimiento estable",
tasa_crecimiento < -0.5 ~ "Crecimiento negativo",
TRUE ~ "Desconocido"
)
) |>
ungroup() |>
drop_na(tasa_crecimiento, tipo_crecimiento) # Eliminar NA en tasa_crecimiento y tipo_crecimiento
# Contar el número de municipios según el tipo de crecimiento
conteo_municipios_crecimiento <- crecimiento_censo |>
group_by(tipo_crecimiento) |>
summarise(
num_municipios = n_distinct(cod_mun), # Contar el número de municipios únicos
.groups = "drop"
)
# Ver el resultado
print(conteo_municipios_crecimiento)# A tibble: 3 × 2
tipo_crecimiento num_municipios
<chr> <int>
1 Crecimiento estable 8135
2 Crecimiento negativo 6991
3 Crecimiento positivo 5028
# Agrupar por tipo de crecimiento y partido, y calcular la preferencia de voto
preferencia_voto_crecimiento <- crecimiento_censo |>
group_by(tipo_crecimiento, partidos) |>
summarise(
total_votos = sum(votos, na.rm = TRUE),
porcentaje_voto = (total_votos / sum(total_votos)) * 100,
.groups = "drop"
) |>
drop_na(partidos) # Eliminar NA en la columna 'partidos'# Filtrar valores válidos en la columna 'partidos'
preferencia_voto_crecimiento <- preferencia_voto_crecimiento |>
filter(!is.na(partidos) & partidos != "OTROS") # Filtra cualquier NA o "OTROS" si es necesario
# Gráfico de barras apiladas para visualizar la preferencia de voto según el crecimiento poblacional
ggplot(preferencia_voto_crecimiento, aes(x = tipo_crecimiento, y = porcentaje_voto, fill = partidos)) +
geom_bar(stat = "identity", position = "fill") +
scale_fill_manual(values = c(
"VOX" = "#80b042",
"PP" = "#004a95",
"PSOE" = "#e30613",
"UP" = "#a668f3",
"CS" = "#ff956a",
"PNV" = "#917b66",
"ERC" = "#edc158",
"EH - BILDU"= "#03cfb5",
"BNG" = "#76b3dd"
)) +
labs(
title = "Preferencia de Voto por Partido según el Tipo de Crecimiento Poblacional",
x = "Tipo de Crecimiento Poblacional",
y = "Porcentaje de Voto (%)",
fill = "Partidos"
) +
scale_y_continuous(labels = scales::percent_format(scale = 100)) + # Modificar escala para mostrar 0 a 100
theme_minimal()